還是要重申,這是菜鳥我目前的回答,學習跟查資料後一定會有更好的答案。
變數:在Ruby中,變數是非大寫開頭的英文字母組合,可加數字但第一個字要英文,不可加符號。
常數:在Ruby中,常數是開頭大寫英文字母組合,可加數字但第一個字要英文。類別及模組等都須以常數來命名,可與變數一樣直接宣告資料為實體,但在Ruby中與其他語言較明顯差異,常數可以更改資料(會有警告)。
菜鳥解答 : 類別及模組類別必須用常數命名,常數第一個英文字母必須用大寫英文,因為Ruby的特性,通常將不會去更動的資料用常數去命名。
初期常會看到的符號是指
:a , :name
並非指加減乘除那些符號。
菜鳥解答 :真想回答沒有差別,在初期學習過程中能明顯知道的差異為,因符號固定記憶體儲存位置所以不可更動,並且因記憶體位置固定,所以使用符號,處理速度較快。
補充:物件後加上.object_id可查詢物件參照位置(object reference)。
有興趣者也可用陣列,數字其他資料來查詢。
重申:內建類別很多程式語言都是相同有的,但是或多或少各程式語言都有特殊的"語法"來處理。
基本介紹,用[]來包住的資料通常都是陣列,例如
[1, 3, 5, 6, 8]
["我", "愛", "聽", "音樂"]
,當然也有許許多多特性以及黑魔法需要學習,例如
#夥伴可以試著自行在Interactive Ruby Shell環境中操作,就是irb那個。
[1, 2, 3] + [7, 8, 9]
[1, 2, 3, 4] - [2, 4, 5]
["我", "愛", "聽", "音樂"].join
陣列像個藥盒,每一格放著可能相同或不同的資料。(空格內可以是nil)
但陣列有個很基礎且大多語言相同的特性,陣列第一個資料我們在呼叫時,他所佔的位置不是1是0,最後一格資料所佔位置是陣列格數n-1,例如
這項特性,初期就常會遇到喔!
Ruby稱雜湊,也有語言稱"字典",與陣列最好辨別的差別是用{}包起,以及每個位置一定有"KEY",位置內當然也可以有nil,但是因為格子內可以放複數資料,所以通常不會用藥盒那樣想Hash,可以想成車站內那種置物箱吧。
{:a => 123, :b => 456, "c" => 789}
{:a => 123, :b => "來聽K-pop!", :c => nil}
{:a => [1, 3, 5], :b => {"as" => 2 , :ccc => "我不要"} , :c => 2021}
一樣有許多語法,讓我們可以操作
{:b => 1, :a => 2}.has_key?(:a)
{:b => 1, :a => 2}.delete(:a)
從陣列到雜湊開始,在Ruby及Rails運用上常常就不會是簡單的加減乘除。其實在網路資料傳輸上,電腦之間傳送的資料都是雜湊型態,例如line內的對話,一張早安圖,不會是一個"早安.jpg"就可以,從長輩傳到我們手上,加上及處理複雜的資料型態,就是程式語言的功能之一。
加碼補充:
new_hash = Hash.new
#可以用
new_hash = {}
#取代
new_arr = Array.new
new_arr = []
也是一樣
很多前輩可能會這樣說,在Ruby中,變數宣告不用像JS需要var, let來協助宣告,其實開始有接觸較複雜的編碼後,可能就不會這樣覺得了。是因為Ruby的生父在創造這語言時,加入了太多的"方便",所以在使用上我們常常直接宣告即可。(js也是可以直接宣告環境變數呀,只要我敢.......但是同事可能會殺了我??)
前對提到,變數用小寫英文字母開頭為命名,例如
x = 123
# x 就是變數, 123就是資料, 變數指向一個資料後, 成為了一個實體, 這個實體開始有許多資料本身可以用的方法可以使用。
例如
變數在Ruby的世界中,還有分一些特別的身份,這部分由分享文章來補充
是的,再次搬出為你自己學Ruby on Rails
建議一定要好好認識實體變數,在進入rails後會發現,實體變數就像你在rails世界中的情人,越了解,感情生活越順遂....
我用比喻的方式來說明,我今天得到一個資料,這個資料是一個數字,我就要將這個資料的數字+2後的結果算出來。這便是流程。
複雜一點的流程,我今天得到一個資料,我先要先判斷這資料是不是一個數字,不是的話告訴傳資料給我的人,是的話如上面一樣運算。
再複雜一點,是數字後,我還要判斷是不是大於100,我再計算。工程師要學習就是將這些複雜的需求變成編碼告訴電腦處理,並且學習將這些編碼簡單化且好閱讀。將編碼的運算速度加快,那是以後的事。
所以定義一個方法,來將資料做處理,就是一整個小流程控制。
如下
而我們進入流程控制後,可能需要一直重複做某些事,直到我們設定的條件為止,讓電腦重複做一件事這個行為就叫迴圈。
如果沒有設定好條件,則可能會進入無限環圈。(可以想想要無限迴圈做啥?)
下篇文章我們用常用的判斷語法及迴圈語法來正式介紹。
題目連結:https://leetcode.com/problems/palindrome-number/
題目解釋,判定數字反轉回數字後,是否還是相同?
例子: 121(true), -121(false), 10(false), -101(false)
整理後如下 (從這邊開始,我們也將可閱讀性加入解題吧。先從變數命名有意義開始)
def is_palindrome(num)
#流程編寫區
end
puts is_palindrome(121)
puts is_palindrome(-121)
puts is_palindrome(10)
puts is_palindrome(-101)
上一題我們提到數字反轉要用
integer.to_s.reverse.to_i
其實多查詢就會發現一個語法是digits,這題我們就用digits來處理吧。
一樣解析一下問題後,將我們需要的流程及特性先用中文整理出來。
def is_palindrome(num)
#負數都是false
#所以大於等於0時才需要去需做反轉
#反轉後判斷是否相同
end
接著先用最囉唆的寫法寫出來。
def is_palindrome(num)
#負數都是false
#所以大於等於0時才需要去需做反轉
if num >= 0
resverse_num = num.digits.join.to_i
else num < 0 #如果判斷點只有兩個,else後面可以不打出
return false
end
#反轉後判斷是否相同
if resverse_num == num.digits.join.to_i
true
else resverse_num != num.digits.join.to_i
false
end
end
接著我們利用一些特性來整理這段控制流程。如果if判斷條件像這種不是a就是b的狀況時,我們可以直接用一項判斷就可以完成編碼,else後面可以省略,並且==這符號等於判斷,如果是單純要true或是false可以省略。所以
def is_palindrome(num)
if num >= 0
resverse_num = num.digits.join.to_i
else
return false
end
resverse_num == num.digits.join.to_i
end
再來,觀察可以發現,我們做判斷時因為去除了負數,而正整數在反轉時,處於文字狀態時就可以判定,所以不需要多一個變數來處理。因此
def is_palindrome(num)
if num >= 0
num.to_s = num.digits.join
else
return false
end
num.to_s == num.digits.join
end
我們再整理答案一下,何時會出現true?
在正整數時,且正整數反轉比對後還相同時,所以其實整題只剩兩個判斷,而判斷式可以用&&來加在一起。
所以
def is_palindrome(num)
if num >= 0 && num.to_s == num.digits.join
true
else
false
end
end
最後也演變成其實不是a就是b的判斷,所以
def is_palindrome(num)
num >= 0 && num.to_s == num.digits.join
end
結束了這一題!